﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//1.分类：按照参数进行分类，无参构造函数（默认构造函数），有参构造函数；
	//按照类型进行分类，普通构造函数，拷贝构造函数；
class PersonConstructor
{
	//2.构造和析构必须写在public下才可以调用到；
public:
	//3.默认，无参构造函数；
	PersonConstructor()
	{
		cout << "默认构造函数调用！" << endl;
	}
	PersonConstructor(int a)
	{
		cout << "有参构造函数调用！" << endl;
	}

	//4.拷贝构造函数；
	PersonConstructor(const PersonConstructor& p)
	{
		m_Age = p.m_Age;
		cout << "拷贝构造函数调用！" << endl;
	}

	~PersonConstructor()
	{
		cout << "析构函数调用！" << endl;
	}

	int m_Age;
};
void testFuncClassify()
{
	//5.构造函数的调用方式：括号法调用；
	PersonConstructor p1(1);//有参构造函数调用！
	p1.m_Age = 10;
	PersonConstructor p2(p1);//拷贝构造函数调用！

	cout << "p2的年龄：" << p2.m_Age << endl;//p2的年龄：10

	//6.默认构造函数，不加();
	PersonConstructor p3;//默认构造函数调用！
	//7.编译器认为这行是函数的声明；
	//PersonConstructor p4();

	//8.显示法调用；
	PersonConstructor p5 = PersonConstructor(100);//有参构造函数调用！
	PersonConstructor p6 = PersonConstructor(p5);//拷贝构造函数调用！

	//9.匿名对象，特点是：如果编译器发现了对象是匿名的，那么这行代码结束后，就释放这个对象；
	PersonConstructor(200);//有参构造函数调用！
	//析构函数调用！

	cout << "这行代码执行前，输出匿名对象的析构函数！" << endl;//这行代码执行前，输出匿名对象的析构函数！

	//10.不能用拷贝构造函数，初始化匿名对象；写成左值这样，编译器会认为写成PersonConstructor p6，报重定义错误；
		//但写成右值，就可以；
	//PersonConstructor(p6);
	PersonConstructor p7 = PersonConstructor(p6);

	//11.隐式类型转换，相当于调用了PersonConstructor p8 = PersonConstructor(100);
	PersonConstructor p8 = 100;
	//相当于PersonConstructor p9 = PersonConstructor(p8);
	PersonConstructor p9 = p8;

	//析构函数调用！
	//析构函数调用！
	//析构函数调用！
	//析构函数调用！
	//析构函数调用！
}

//main258：构造函数的分类和调用
int main258()
{
	testFuncClassify();

	system("pause");
	return EXIT_SUCCESS;
}